iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

昨天我們介紹了多資產的配置投資,但是面上有這麼多標的我該投資那一些呢 ? 今天,我們將學習因子投資的概念,並探索如何使用不同的因子來進行投資策略的構建與優化。因子投資是一種基於特定因素(因子)的系統化投資方法,能夠有效地幫助投資者在複雜的市場環境中找到超額收益的來源。今日 Colab


一、因子投資的概念

1. 什麼是因子投資?

因子投資是一種基於資產的特定特徵或驅動因素(因子)來構建投資組合的方法。這些因子通常代表資產的某些特徵,如估值、成長、質量、動量、規模等,這些特徵會對資產的未來表現產生影響。

2. 常見的因子類型

  • 估值因子(Value):衡量資產的相對價值,如市盈率(P/E)市淨率(P/B)等。低估值資產通常被認為具有較高的投資潛力。
  • 動量因子(Momentum):基於資產的歷史價格變動,投資於近期表現優異的資產,預期其趨勢會持續。
  • 質量因子(Quality):評估資產的財務健全性,如盈利能力、資產負債比等。
  • 規模因子(Size):投資於市值較小的公司,因為小型公司往往具有較高的增長潛力。
  • 波動率因子(Low Volatility):選擇波動性較低的資產,因為它們在長期內往往表現穩定且具備較高的風險調整後收益。

https://ithelp.ithome.com.tw/upload/images/20240924/20120549Yep7BSsPrf.jpg


二、因子投資策略的構建

我們將以一個簡單的多因子投資策略為例,使用估值因子與動量因子來構建投資組合。

1. 資料準備

我們將使用 yfinance 獲取股票的歷史數據,並計算兩個因子(估值和動量)來構建投資組合。

import yfinance as yf
import pandas as pd

# 下載多個股票的歷史數據
symbols = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'Meta']
data = yf.download(symbols, start='2019-01-01', end='2021-01-01')['Adj Close']

# 計算估值因子(以P/E Ratio為例,這裡我們用股價近似代替)
valuation_factor = data.tail(1).T  # 最新一天的價格,作為估值的代表

# 計算動量因子(過去6個月的回報率)
momentum_factor = data.pct_change(periods=126).tail(1).T  # 126天約為6個月

2. 因子標準化與排序

將不同因子進行標準化,然後對股票進行打分,並選擇打分最高的資產進行投資。

# 因子標準化
# 計算估值因子(以P/E Ratio為例,這裡我們用股價近似代替)
valuation_factor = data.tail(1).T  # 最新一天的價格,作為估值的代表

# 計算動量因子(過去6個月的回報率)
momentum_factor = data.pct_change(periods=126).tail(1).T  # 126天約為6個月

# 因子標準化
valuation_factor = (valuation_factor - valuation_factor.mean()) / valuation_factor.std()
momentum_factor = (momentum_factor - momentum_factor.mean()) / momentum_factor.std()

# 綜合因子得分(權重可自行調整,這裡我們取相等權重)
factor_scores = 0.5 * valuation_factor + 0.5 * momentum_factor

# 將 DataFrame 轉換為 Series,並以 index(股票符號)作為索引
factor_scores = factor_scores.squeeze()  # 將單列 DataFrame 轉換為 Series

# 根據綜合得分進行排序
factor_scores = factor_scores.sort_values(ascending=False)

3. 選擇投資組合

我們選擇因子得分最高的2只股票構建投資組合。

# 選擇得分最高的2只股票
top_stocks = factor_scores.index[:2]
print("選擇的投資組合:", top_stocks)

https://ithelp.ithome.com.tw/upload/images/20240924/20120549Gr1bCOCLhT.png

三、因子投資組合的回測

我們將使用 Backtrader 進行簡單的回測,以測試因子投資組合的表現。

1. 定義因子投資策略

import backtrader as bt

class FactorInvestmentStrategy(bt.Strategy):
    def __init__(self):
        self.size = 0  # 用於保存持倉量
        self.top_stocks = top_stocks  # 使用之前選定的投資組合

    def next(self):
        if not self.position:
            cash = self.broker.getcash()
            per_stock_cash = cash / len(self.top_stocks)
            for data in self.datas:
                if data._name in self.top_stocks:
                    size = int(per_stock_cash / data.close[0])
                    self.buy(data=data, size=size)

2. 執行回測

cerebro = bt.Cerebro()

# 添加策略
cerebro.addstrategy(FactorInvestmentStrategy)

# 添加選定股票的數據
for symbol in top_stocks:
    data_feed = bt.feeds.PandasData(dataname=yf.download(symbol, start="2019-01-01", end="2021-01-01"))
    cerebro.adddata(data_feed, name=symbol)

# 設定初始資金
cerebro.broker.setcash(100000.0)

# 添加分析工具
cerebro.addanalyzer(btanalyzers.SharpeRatio, _name="sharpe", timeframe=bt.TimeFrame.Days, annualize=True)
cerebro.addanalyzer(btanalyzers.DrawDown, _name="drawdown")
cerebro.addanalyzer(btanalyzers.Returns, _name="returns")

# 執行回測
result = cerebro.run()
strategy = result[0]

# 提取分析結果
sharpe_ratio = strategy.analyzers.sharpe.get_analysis().get('sharperatio', None)
max_drawdown = strategy.analyzers.drawdown.get_analysis().get('max', {}).get('drawdown', None)
total_return = strategy.analyzers.returns.get_analysis().get('rnorm100', None)

# 打印分析結果
print(f"夏普比率: {sharpe_ratio:.2f}" if sharpe_ratio is not None else "夏普比率: 無法計算")
print(f"最大回撤: {max_drawdown:.2f}%")
print(f"總收益: {total_return:.2f}%")

# 執行回測
cerebro.run()
#cerebro.plot(iplot=False)
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = [15, 12]
plt.rcParams.update({'font.size': 12})
img = cerebro.plot(iplot = False)
img[0][0].savefig('backtrader_factor.png')

可以得到以下夏普等值:
https://ithelp.ithome.com.tw/upload/images/20240924/20120549rMV3fJW881.png
以及圖表:
https://ithelp.ithome.com.tw/upload/images/20240924/20120549UqfwrT3cUD.png


四、因子投資策略的優化與應用

  1. 因子篩選與組合:你可以嘗試不同的因子組合,如結合質量因子與動量因子,以構建不同的投資策略。
  2. 動態調整:根據市場情況,定期重新計算並調整投資組合,確保投資組合能夠反映最新的市場資訊。
  3. 多因子模型:結合多個因子(例如估值、動量、質量等),並使用多因子模型進行權重優化,以創建更穩定的投資組合。

五、總結與作業

因子投資是一種非常強大的投資策略,能夠幫助投資者系統化地構建投資組合,並有效地實現風險調整後的收益。

今日作業:

  1. 試著使用更多因子(如規模、質量、低波動率等)來構建自己的因子投資策略。
  2. 使用 Backtrader 回測你的多因子策略,並比較不同因子組合的表現。
  3. 分析因子策略在不同市場環境下的表現,並思考如何進行動態調整以提高收益。

透過這些練習,你將能夠更好地掌握因子投資的方法,並學會如何將這些概念應用到真實的投資中。


上一篇
Day9:多資產投資組合
下一篇
Day11:引入AI—機器學習概述與數據預處理
系列文
打開就會 AI 與數據分析的投資理財術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言